package Servidor;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.StringTokenizer;

import ClasesBasicas.Medicion;
import ClasesBasicas.Sensor;
import bd.Datos;

public class ProcesarComandos {
    private Datos datos;
	private HashMap <String,String> usuarios=datos.cargarUsuarios();
	private String respuestaServidor;
	private String CRLF="\r\n";
	private StringTokenizer tokenizer;
	private int estado;
	private List<Sensor> sensores = datos.getSensores();
	
	public List<String> procesar(String comando, Request peticion)
	{
		List<String> respuesta=new ArrayList();
		estado=peticion.getEstado();
		tokenizer=new StringTokenizer(comando);
		switch (estado)
		{
		case 0:
			if(tokenizer.nextToken().equals("Usuario"))
				{
					if(tokenizer.countTokens()==1)
						{
						  	respuesta.add("501 ERR Falta el nombre de usuario"+CRLF);
						  	
						}
					else
						{
						if(tokenizer.countTokens()==2)
						{
							String usuario=tokenizer.nextToken();
							respuesta.add("301 OK Bienvenido "+usuario+CRLF);
							peticion.setUsuarioActual(usuario);
							peticion.setEstado(peticion.getEstado()+1);
						}
						}
				}
		 break;
			case 1:
				if(tokenizer.nextToken().equals("CLAVE"))
				{
					if(tokenizer.countTokens()==1)
					{
						respuesta.add("503 ERR Falta la clave "+CRLF);
					}
					else if(tokenizer.countTokens()==2)
					{
						if(usuarios.containsKey(peticion.getUsuarioActual()))
						{
							if(tokenizer.nextToken().equals(usuarios.get(peticion.getUsuarioActual())))
							{
								respuesta.add("302 OK Bienvenido al sistema."+CRLF);
							}
							else 
							{
								respuesta.add("502 ERR La clave es incorrecta."+CRLF);
							}
						}
					}
				}
			break;
			case 2:
				if(tokenizer.nextToken().equals("LISTSENSOR")&&tokenizer.hasMoreElements()==false)
				{
					respuesta.add("222 OK Lista de sensores."+CRLF);
					for(int i=0; i<sensores.size();i++)
					{
						respuesta.add(sensores.get(i).getId_sensor()+";"+CRLF);
						respuesta.add(sensores.get(i).getDescripcion()+";"+CRLF);
						respuesta.add(sensores.get(i).getEstado()+CRLF);
					}
					respuesta.add("322 OK Lista finalizada"+CRLF);
				}
				else if(tokenizer.nextToken().equals("HISTORICO"))
				{
					if(!tokenizer.hasMoreElements())
					{
						respuesta.add("525 ERR Falta parametro id_sensor."+CRLF);
					}
					else
					{
					   String Id_Sensor=tokenizer.nextToken();
					   Sensor sensor=datos.getSensor(Id_Sensor);
					   if(sensor==null)
					   {
						   respuesta.add("524 ERR Sensor desconocido."+CRLF);
					   }
					   else
					   {
						   List<Medicion> mediciones=datos.getMediciones(Id_Sensor);
						   for(int i=0;i<mediciones.size();i++)
						   {
							   Medicion actual=mediciones.get(i);
						       respuesta.add(actual.getFecha()+";"+actual.getHora()+";"+actual.getLatitud()+";"+actual.getLatitud()+CRLF);
						   }
						   respuesta.add("322 OK Lista finalizada."+CRLF);
					   }
				}
		}
				else if(tokenizer.nextToken().equals("ON"))
				{
					String Id_Sensor=tokenizer.nextToken();
					Sensor sensor=datos.getSensor(Id_Sensor);
					if(sensor==null)
					{
						respuesta.add("527 ERR Sensor no existe."+CRLF);
					}
					else 
					{
						if(sensor.getEstado().equals("ON"))
						{
							respuesta.add("528 ERR Sensor en estado ON."+CRLF);
						}
						else
						{
							datos.encenderSensor(Id_Sensor);
							respuesta.add("313 OK Sensor activo."+CRLF);
						}
					}
				}
				else if(tokenizer.nextToken().equals("OFF"))
				{
					String Id_Sensor=tokenizer.nextToken();
					Sensor sensor=datos.getSensor(Id_Sensor);
					if(sensor==null)
					{
						respuesta.add("527 ERR Sensor no existe."+CRLF);
					}
					else 
					{
						if(sensor.getEstado().equals("OFF"))
						{
							respuesta.add("529 ERR Sensor en estado OFF."+CRLF);
						}
						else
						{
							datos.apagarSensor(Id_Sensor);
							respuesta.add("314 OK Sensor desactivado."+CRLF);
						}
					}
				}
				else if(tokenizer.nextToken().equals("ONGPS"))
				{
					Sensor GPS= datos.getGPS();
					if(GPS.getEstado().equals("ON"))
					{
						respuesta.add("529 ERR GPS en estado ON."+CRLF);
					}
					else
					{
						datos.encenderGPS();
						respuesta.add("315 OK GPS activado."+CRLF);
					}
				}
				else if(tokenizer.nextToken().equals("OFFGPS"))
				{
					Sensor GPS = datos.getGPS();
					if(GPS.getEstado().equals("OFF"))
					{
						respuesta.add("530 ERR GPS en estado OFF."+CRLF);
					}
					else
					{
						datos.apagarGPS();
						respuesta.add("316 OK GPS desactivado."+CRLF);
					}
				}
				else if(tokenizer.nextToken().equals("GET_VALACT"))
				{
					if(!tokenizer.hasMoreTokens())
					{
						respuesta.add("525 ERR Falta parametro id_sensor."+CRLF);
					}
					else
					{
						Sensor sensor=datos.getSensor(tokenizer.nextToken());
						if(sensor.equals(null))
						{
							respuesta.add("524 ERR Sensor desconocido."+CRLF);
						}
						else if(sensor.getEstado().equals("OFF"))
						{
							respuesta.add("526 ERR Falta parametro id_sensor");
						}
						else
						{
							Medicion medicion=datos.getMedicion(sensor.getId_sensor());
							respuesta.add(medicion.getFecha()+";");
							respuesta.add(medicion.getHora()+";");
							respuesta.add(medicion.getLatitud()+"-");
							respuesta.add(medicion.getLongitud()+";");
							respuesta.add(Double.toString(medicion.getValor()));
						}
					}
				}
				
				
				
					
				}
		return respuesta;
	}
}

